#include<iostream>
using namespace std;

struct Map {
    int x, y, arr[3][3], step;
    
    Map() {
        // 构造函数
        step = 0;
    }
}start, target, list[100000];

// 右、下、左、上
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int front=0, rear=-1;

bool check_same(Map map1, Map map2) {
    // 功能：判断两个Map对象二维数组是否相同。相同为true，不同为false
    for(int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            if (map1.arr[i][j] != map2.arr[i][j])
                return false;
        }
    }
    return true;
}

bool check(Map map) {
    // 判断是否重复，重复为false，不重复为true
    for (int i=0; i<=rear; i++) {
        if(check_same(map, list[i]))
            return false;
    }
    return true;
}

int main() {
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) {
            int temp;
            cin >> temp;
            start.arr[i][j] = temp;
            if (temp == 0) {
                start.x = i;
                start.y = j;
            }
        }
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) {
            int temp;
            cin >> temp;
            target.arr[i][j] = temp;
        }
    
    // start.push(qu);
    start.step++;
    // 进队操作
    // ++i，先加后i；i++，先i后加
    list[++rear] = start;

    while(front <= rear) {
        for(int i=0; i<4; i++) {
            Map map = list[front];
            int xx = map.x + dx[i];
            int yy = map.y + dy[i];
            if (xx>=0 && xx<=2 && yy>=0 && yy<=2) {
                swap(map.arr[xx][yy], map.arr[map.x][map.y]);
                map.x = xx;
                map.y = yy;
                map.step++;

                if(!check(map)) continue;
                if(check_same(map, target)) {
                    cout << map.step;
                    return 0;
                }
                list[++rear] = map;
            }
        }
        // 出队
        front++;
    }
    return 0;
}
